﻿using System;

namespace Hanoi_Tower
{
    class Program
    {
          static int Count=0; //定义圆盘移动次数，注意放到函数外

        static void Main(string[] args)
        {
            Console.Clear();
            Console.WriteLine("请输入圆盘的个数");
            int n = Convert.ToInt32(Console.ReadLine());//确定圆盘个数同时便于检验代码正确性
            //定义三个命名为A,B,C的柱子变量
            char x = 'A';
            char y = 'B';
            char z = 'C';
            Hanoi(n, x, y, z);//调用函数，列出圆盘移动方案
            Console.WriteLine("圆盘总的移动次数为{0}",Count);//计算圆盘所需移动次数
            Console.ReadKey();
        }

        /// <summary>
        /// 实现将圆盘移动过程输出并计算总的移动次数
        /// </summary>
        static void Move(int n, char x, char y)
        {
            Console.WriteLine("圆盘{0}从{1}移动至{2}", n, x, y);
            Count++;
        }

        /// <summary>
        /// 实现圆盘从x出发，通过y，最终全部移动到z上
        /// </summary>
        static void Hanoi(int n, char x, char y, char z)
        {
            if (n == 1)//当函数递归至n=1时，递归结束
                Move(1, x, z);
            else
            {
                Hanoi(n - 1, x, z, y);//前n-1的最终摆放位置确定在y
                Move(n, x, z);
                Hanoi(n - 1, y, x, z);//最终n个盘的摆放位置确定在z
            }
        }
    }
}
